/*
I/O数据传输，肯定要用到数据输入流和输出流，Socket对象提供getInputStream和getOutputStream
客户端要把数据输出给服务端，要用OutputStreamWriter
 */
package MySocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class DataClient {
    public static void main(String[] args) {
        try(Socket socket = new Socket(); Scanner scanner = new Scanner(System.in)){
            //可以先创建Socket对象，不连接，下面使用Socket对象的connect方法连接。为了效果演示，这里使用Scanner接收输入，输入的东西直接到Server

            socket.setKeepAlive(true);  //设置keepAlive,防止一端崩溃后，另一端还在占用连接资源，
            // 当对方没有发送数据过来，超过一个时间（系统内核参数设置的），我们这边会发一个ack探测包到对方，探测双发的TCP连接是否有效

            //TCP在传输过程中，实际上是有一个缓冲区用于数据的发送和接收，此缓冲区大小为8192，我们可以手动调整大小来优化传输效率，一般用不到
            socket.setReceiveBufferSize(25500);
            socket.setSendBufferSize(66666);

            socket.connect(new InetSocketAddress("127.0.0.1", 8086),1000);
            //使用Socket的connect方法连接远程端口，但用了InetSocketAddress()封装,设置连接超时1000毫毛，防止连接不到服务端，一直卡着

            System.out.println("已连接到服务器...");
            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());  //定义输出数据流，输出给Socket对象的getOutputStream()
            writer.write(scanner.nextLine()+"\n"); //手动输入的内容输出到server，要价格换行，server的BufferedReader的readLine()才能读到
            writer.flush();  //使用flush()刷新一下才会发送
            System.out.println("数据已发送");

            //如果已经发送完成，可以手动提权关闭单向流，这里手动关闭单向输出流
            socket.shutdownOutput();

            //接收服务端返回的数据，使用BufferedReader包装的InputStreamReader
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(reader.readLine());

            //Input用完了可以提提前关闭，不用等socket.close()
            socket.shutdownInput();

        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
